/*
 * Copyright (c) 2018 Tencent. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
const AbstractModel = require("../../common/abstract_model");

/**
 * DescribeExtendEndpointList request structure.
 * @class
 */
class DescribeExtendEndpointListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Pagination offset, starting from 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Pagination limit. Maximum value: 100. Default value: 20.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters. Valid values: EndpointName, EndpointId.
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * DescribeQuotaUsage response structure.
 * @class
 */
class DescribeQuotaUsageResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * TLD quota usage
         * @type {TldQuota || null}
         */
        this.TldQuota = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.TldQuota) {
            let obj = new TldQuota();
            obj.deserialize(params.TldQuota)
            this.TldQuota = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyPrivateZoneVpc request structure.
 * @class
 */
class ModifyPrivateZoneVpcRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * List of all VPCs associated with private domain
         * @type {Array.<VpcInfo> || null}
         */
        this.VpcSet = null;

        /**
         * List of authorized accounts' VPCs to associate with the private domain
         * @type {Array.<AccountVpcInfo> || null}
         */
        this.AccountVpcSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }

        if (params.AccountVpcSet) {
            this.AccountVpcSet = new Array();
            for (let z in params.AccountVpcSet) {
                let obj = new AccountVpcInfo();
                obj.deserialize(params.AccountVpcSet[z]);
                this.AccountVpcSet.push(obj);
            }
        }

    }
}

/**
 * CreateEndPointAndEndPointService response structure.
 * @class
 */
class CreateEndPointAndEndPointServiceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint service ID.
         * @type {string || null}
         */
        this.EndPointServiceId = null;

        /**
         * IP address list of the endpoint.
         * @type {Array.<string> || null}
         */
        this.EndPointVipSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointServiceId = 'EndPointServiceId' in params ? params.EndPointServiceId : null;
        this.EndPointVipSet = 'EndPointVipSet' in params ? params.EndPointVipSet : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * PrivateDNS outbound endpoint forwarding IP
 * @class
 */
class ForwardIp extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding target IP network access type.
CLB: The forwarding IP is the internal CLB VIP.
CCN: Forwarding IP through CCN routing.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Forwarding target IP address.
         * @type {string || null}
         */
        this.Host = null;

        /**
         * Specifies the forwarding IP port number.
         * @type {number || null}
         */
        this.Port = null;

        /**
         * Specifies the number of outbound endpoints.
Minimum 1, maximum 6.
         * @type {number || null}
         */
        this.IpNum = null;

        /**
         * Unique VPC ID.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * Unique subnet ID.
Required when the access type is CCN.
         * @type {string || null}
         */
        this.SubnetId = null;

        /**
         * ccn id
Required when the access type is CCN.
         * @type {string || null}
         */
        this.AccessGatewayId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AccessType = 'AccessType' in params ? params.AccessType : null;
        this.Host = 'Host' in params ? params.Host : null;
        this.Port = 'Port' in params ? params.Port : null;
        this.IpNum = 'IpNum' in params ? params.IpNum : null;
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.SubnetId = 'SubnetId' in params ? params.SubnetId : null;
        this.AccessGatewayId = 'AccessGatewayId' in params ? params.AccessGatewayId : null;

    }
}

/**
 * DescribePrivateDNSAccountList response structure.
 * @class
 */
class DescribePrivateDNSAccountListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of Private DNS accounts
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * List of Private DNS accounts
         * @type {Array.<PrivateDNSAccount> || null}
         */
        this.AccountSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.AccountSet) {
            this.AccountSet = new Array();
            for (let z in params.AccountSet) {
                let obj = new PrivateDNSAccount();
                obj.deserialize(params.AccountSet[z]);
                this.AccountSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateForwardRule request structure.
 * @class
 */
class CreateForwardRuleRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding rule name.
         * @type {string || null}
         */
        this.RuleName = null;

        /**
         * Forwarding rule type. DOWN: From cloud to off-cloud; UP: From off-cloud to cloud.
         * @type {string || null}
         */
        this.RuleType = null;

        /**
         * Private domain ID, which can be viewed on the private domain list page.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleName = 'RuleName' in params ? params.RuleName : null;
        this.RuleType = 'RuleType' in params ? params.RuleType : null;
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;

    }
}

/**
 * Private DNS account
 * @class
 */
class PrivateDNSAccount extends  AbstractModel {
    constructor(){
        super();

        /**
         * Root account UIN
         * @type {string || null}
         */
        this.Uin = null;

        /**
         * Root account name
         * @type {string || null}
         */
        this.Account = null;

        /**
         * Account name
         * @type {string || null}
         */
        this.Nickname = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Uin = 'Uin' in params ? params.Uin : null;
        this.Account = 'Account' in params ? params.Account : null;
        this.Nickname = 'Nickname' in params ? params.Nickname : null;

    }
}

/**
 * DescribeForwardRuleList request structure.
 * @class
 */
class DescribeForwardRuleListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Pagination offset, starting from 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Pagination limit. Maximum value: 100. Default value: 20.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters.
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * DescribeEndPointList request structure.
 * @class
 */
class DescribeEndPointListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Pagination offset, starting from 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Pagination limit. Maximum value: 100. Default value: 20.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters. Valid values: EndPointName, EndPointId, EndPointServiceId, and EndPointVip.
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * DescribePrivateZoneRecordList response structure.
 * @class
 */
class DescribePrivateZoneRecordListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of DNS records
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * List of DNS records
         * @type {Array.<PrivateZoneRecord> || null}
         */
        this.RecordSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.RecordSet) {
            this.RecordSet = new Array();
            for (let z in params.RecordSet) {
                let obj = new PrivateZoneRecord();
                obj.deserialize(params.RecordSet[z]);
                this.RecordSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribePrivateZoneList response structure.
 * @class
 */
class DescribePrivateZoneListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of private domains.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Private domain list.
         * @type {Array.<PrivateZone> || null}
         */
        this.PrivateZoneSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.PrivateZoneSet) {
            this.PrivateZoneSet = new Array();
            for (let z in params.PrivateZoneSet) {
                let obj = new PrivateZone();
                obj.deserialize(params.PrivateZoneSet[z]);
                this.PrivateZoneSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Output parameters of the associated VPC
 * @class
 */
class AccountVpcInfoOutput extends  AbstractModel {
    constructor(){
        super();

        /**
         * UIN of the VPC account
         * @type {string || null}
         */
        this.Uin = null;

        /**
         * VPC ID
         * @type {string || null}
         */
        this.UniqVpcId = null;

        /**
         * Region
         * @type {string || null}
         */
        this.Region = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Uin = 'Uin' in params ? params.Uin : null;
        this.UniqVpcId = 'UniqVpcId' in params ? params.UniqVpcId : null;
        this.Region = 'Region' in params ? params.Region : null;

    }
}

/**
 * DescribeEndPointRegion request structure.
 * @class
 */
class DescribeEndPointRegionRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * DescribeAuditLog response structure.
 * @class
 */
class DescribeAuditLogResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * List of operation logs
         * @type {Array.<AuditLog> || null}
         */
        this.Data = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Data) {
            this.Data = new Array();
            for (let z in params.Data) {
                let obj = new AuditLog();
                obj.deserialize(params.Data[z]);
                this.Data.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyRecordsStatus response structure.
 * @class
 */
class ModifyRecordsStatusResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * The DNS record IDs.
         * @type {Array.<number> || null}
         */
        this.RecordIds = null;

        /**
         * `enabled`: Enabled; `disabled`: Disabled.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordIds = 'RecordIds' in params ? params.RecordIds : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateExtendEndpoint request structure.
 * @class
 */
class CreateExtendEndpointRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Outbound endpoint name.
         * @type {string || null}
         */
        this.EndpointName = null;

        /**
         * The region of the outbound endpoint must be consistent with the region of the forwarding target VIP.
         * @type {string || null}
         */
        this.EndpointRegion = null;

        /**
         * Forwarding target.
         * @type {ForwardIp || null}
         */
        this.ForwardIp = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndpointName = 'EndpointName' in params ? params.EndpointName : null;
        this.EndpointRegion = 'EndpointRegion' in params ? params.EndpointRegion : null;

        if (params.ForwardIp) {
            let obj = new ForwardIp();
            obj.deserialize(params.ForwardIp)
            this.ForwardIp = obj;
        }

    }
}

/**
 * Time statistics
 * @class
 */
class DatePoint extends  AbstractModel {
    constructor(){
        super();

        /**
         * Time
         * @type {string || null}
         */
        this.Date = null;

        /**
         * Value
         * @type {number || null}
         */
        this.Value = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Date = 'Date' in params ? params.Date : null;
        this.Value = 'Value' in params ? params.Value : null;

    }
}

/**
 * DescribeAccountVpcList response structure.
 * @class
 */
class DescribeAccountVpcListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of VPCs
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * VPC list
         * @type {Array.<AccountVpcInfoOut> || null}
         */
        this.VpcSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new AccountVpcInfoOut();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeEndPointRegion response structure.
 * @class
 */
class DescribeEndPointRegionResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Region array.
         * @type {Array.<RegionInfo> || null}
         */
        this.RegionSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.RegionSet) {
            this.RegionSet = new Array();
            for (let z in params.RegionSet) {
                let obj = new RegionInfo();
                obj.deserialize(params.RegionSet[z]);
                this.RegionSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DeleteEndPoint response structure.
 * @class
 */
class DeleteEndPointResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Filter parameter
 * @class
 */
class Filter extends  AbstractModel {
    constructor(){
        super();

        /**
         * Parameter name
         * @type {string || null}
         */
        this.Name = null;

        /**
         * Array of parameter values
         * @type {Array.<string> || null}
         */
        this.Values = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Name = 'Name' in params ? params.Name : null;
        this.Values = 'Values' in params ? params.Values : null;

    }
}

/**
 * Private domain information
 * @class
 */
class PrivateZoneRecord extends  AbstractModel {
    constructor(){
        super();

        /**
         * Record ID
         * @type {string || null}
         */
        this.RecordId = null;

        /**
         * Private domain ID: zone-xxxxxxxx
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Subdomain
         * @type {string || null}
         */
        this.SubDomain = null;

        /**
         * Record type. Valid values: "A", "AAAA", "CNAME", "MX", "TXT", "PTR"
         * @type {string || null}
         */
        this.RecordType = null;

        /**
         * Record value
         * @type {string || null}
         */
        this.RecordValue = null;

        /**
         * Record cache time. The smaller the value, the faster the record will take effect. Value range: 1–86400s. Default value: 600
         * @type {number || null}
         */
        this.TTL = null;

        /**
         * MX priority, which is required when the record type is MX. Valid values: 5, 10, 15, 20, 30, 40, 50
Note: this field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.MX = null;

        /**
         * Record status: ENABLED
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Record weight. Value range: 1–100
Note: this field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.Weight = null;

        /**
         * Record creation time
         * @type {string || null}
         */
        this.CreatedOn = null;

        /**
         * Record update time
         * @type {string || null}
         */
        this.UpdatedOn = null;

        /**
         * Additional information
Note: this field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Extra = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RecordId = 'RecordId' in params ? params.RecordId : null;
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.SubDomain = 'SubDomain' in params ? params.SubDomain : null;
        this.RecordType = 'RecordType' in params ? params.RecordType : null;
        this.RecordValue = 'RecordValue' in params ? params.RecordValue : null;
        this.TTL = 'TTL' in params ? params.TTL : null;
        this.MX = 'MX' in params ? params.MX : null;
        this.Status = 'Status' in params ? params.Status : null;
        this.Weight = 'Weight' in params ? params.Weight : null;
        this.CreatedOn = 'CreatedOn' in params ? params.CreatedOn : null;
        this.UpdatedOn = 'UpdatedOn' in params ? params.UpdatedOn : null;
        this.Extra = 'Extra' in params ? params.Extra : null;

    }
}

/**
 * DescribePrivateDNSAccountList request structure.
 * @class
 */
class DescribePrivateDNSAccountListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Pagination offset, starting from `0`
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of entries per page. Maximum value: `100`. Default value: `20`
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * DeleteEndPoint request structure.
 * @class
 */
class DeleteEndPointRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;

    }
}

/**
 * Log details
 * @class
 */
class AuditLogInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Time
         * @type {string || null}
         */
        this.Date = null;

        /**
         * Operator UIN
         * @type {string || null}
         */
        this.OperatorUin = null;

        /**
         * Log content
         * @type {string || null}
         */
        this.Content = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Date = 'Date' in params ? params.Date : null;
        this.OperatorUin = 'OperatorUin' in params ? params.OperatorUin : null;
        this.Content = 'Content' in params ? params.Content : null;

    }
}

/**
 * Outbound endpoint.
 * @class
 */
class OutboundEndpoint extends  AbstractModel {
    constructor(){
        super();

        /**
         * Outbound endpoint ID.
         * @type {string || null}
         */
        this.EndpointId = null;

        /**
         * Outbound endpoint name.
         * @type {string || null}
         */
        this.EndpointName = null;

        /**
         * The region of the outbound endpoint.
         * @type {string || null}
         */
        this.Region = null;

        /**
         * Tag
         * @type {Array.<TagInfo> || null}
         */
        this.Tags = null;

        /**
         * Outbound endpoint information.
Returned only when the forwarding architecture is V2R.
         * @type {Array.<EndpointService> || null}
         */
        this.EndpointServiceSet = null;

        /**
         * Forwarding link architecture.
V2V: privatelink
V2R: jnsgw
         * @type {string || null}
         */
        this.ForwardLinkArch = null;

        /**
         * Endpoint service ID.

Returned only when the forwarding architecture is V2V.

         * @type {string || null}
         */
        this.EndPointServiceId = null;

        /**
         * VIP list of the endpoint.

Returned only when the forwarding architecture is V2V.
         * @type {Array.<string> || null}
         */
        this.EndPointVipSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndpointId = 'EndpointId' in params ? params.EndpointId : null;
        this.EndpointName = 'EndpointName' in params ? params.EndpointName : null;
        this.Region = 'Region' in params ? params.Region : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagInfo();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

        if (params.EndpointServiceSet) {
            this.EndpointServiceSet = new Array();
            for (let z in params.EndpointServiceSet) {
                let obj = new EndpointService();
                obj.deserialize(params.EndpointServiceSet[z]);
                this.EndpointServiceSet.push(obj);
            }
        }
        this.ForwardLinkArch = 'ForwardLinkArch' in params ? params.ForwardLinkArch : null;
        this.EndPointServiceId = 'EndPointServiceId' in params ? params.EndPointServiceId : null;
        this.EndPointVipSet = 'EndPointVipSet' in params ? params.EndPointVipSet : null;

    }
}

/**
 * DescribeRequestData request structure.
 * @class
 */
class DescribeRequestDataRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Request volume statistics start time in the format of 2020-11-22 00:00:00
         * @type {string || null}
         */
        this.TimeRangeBegin = null;

        /**
         * Filter parameter:
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

        /**
         * Request volume statistics end time in the format of 2020-11-22 23:59:59
         * @type {string || null}
         */
        this.TimeRangeEnd = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TimeRangeBegin = 'TimeRangeBegin' in params ? params.TimeRangeBegin : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }
        this.TimeRangeEnd = 'TimeRangeEnd' in params ? params.TimeRangeEnd : null;

    }
}

/**
 * ModifyPrivateZoneRecord response structure.
 * @class
 */
class ModifyPrivateZoneRecordResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeAccountVpcList request structure.
 * @class
 */
class DescribeAccountVpcListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * UIN of account
         * @type {string || null}
         */
        this.AccountUin = null;

        /**
         * Pagination offset, starting from 0
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of entries per page. Maximum value: `100`. Default value: `20`
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AccountUin = 'AccountUin' in params ? params.AccountUin : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * CreateExtendEndpoint response structure.
 * @class
 */
class CreateExtendEndpointResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndpointId = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndpointName = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndpointId = 'EndpointId' in params ? params.EndpointId : null;
        this.EndpointName = 'EndpointName' in params ? params.EndpointName : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeRequestData response structure.
 * @class
 */
class DescribeRequestDataResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Request volume statistics table
         * @type {Array.<MetricData> || null}
         */
        this.Data = null;

        /**
         * Request volume unit time. Valid values: Day, Hour
         * @type {string || null}
         */
        this.Interval = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Data) {
            this.Data = new Array();
            for (let z in params.Data) {
                let obj = new MetricData();
                obj.deserialize(params.Data[z]);
                this.Data.push(obj);
            }
        }
        this.Interval = 'Interval' in params ? params.Interval : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeEndPointList response structure.
 * @class
 */
class DescribeEndPointListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of endpoints.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Endpoint list.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<EndPointInfo> || null}
         */
        this.EndPointSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.EndPointSet) {
            this.EndPointSet = new Array();
            for (let z in params.EndPointSet) {
                let obj = new EndPointInfo();
                obj.deserialize(params.EndPointSet[z]);
                this.EndPointSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Region information
 * @class
 */
class RegionInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Region encoding
         * @type {string || null}
         */
        this.RegionCode = null;

        /**
         * Region name

Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.CnName = null;

        /**
         * English name of the region
         * @type {string || null}
         */
        this.EnName = null;

        /**
         * Region ID

Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.RegionId = null;

        /**
         * Number of AZs

Note: This field may return null, indicating that no valid values can be obtained.
         * @type {number || null}
         */
        this.AvailableZoneNum = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RegionCode = 'RegionCode' in params ? params.RegionCode : null;
        this.CnName = 'CnName' in params ? params.CnName : null;
        this.EnName = 'EnName' in params ? params.EnName : null;
        this.RegionId = 'RegionId' in params ? params.RegionId : null;
        this.AvailableZoneNum = 'AvailableZoneNum' in params ? params.AvailableZoneNum : null;

    }
}

/**
 * Tag
 * @class
 */
class TagInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Tag key
         * @type {string || null}
         */
        this.TagKey = null;

        /**
         * Tag value
         * @type {string || null}
         */
        this.TagValue = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TagKey = 'TagKey' in params ? params.TagKey : null;
        this.TagValue = 'TagValue' in params ? params.TagValue : null;

    }
}

/**
 * TLD quota
 * @class
 */
class TldQuota extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total quota
         * @type {number || null}
         */
        this.Total = null;

        /**
         * Used quota
         * @type {number || null}
         */
        this.Used = null;

        /**
         * Available quota
         * @type {number || null}
         */
        this.Stock = null;

        /**
         * User’s quota
         * @type {number || null}
         */
        this.Quota = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Total = 'Total' in params ? params.Total : null;
        this.Used = 'Used' in params ? params.Used : null;
        this.Stock = 'Stock' in params ? params.Stock : null;
        this.Quota = 'Quota' in params ? params.Quota : null;

    }
}

/**
 * SubscribePrivateZoneService response structure.
 * @class
 */
class SubscribePrivateZoneServiceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private DNS service activation status
         * @type {string || null}
         */
        this.ServiceStatus = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ServiceStatus = 'ServiceStatus' in params ? params.ServiceStatus : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreatePrivateZone request structure.
 * @class
 */
class CreatePrivateZoneRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Domain name, which must be in the format of standard TLD
         * @type {string || null}
         */
        this.Domain = null;

        /**
         * Tags the private domain when it is created
         * @type {Array.<TagInfo> || null}
         */
        this.TagSet = null;

        /**
         * Associates the private domain to a VPC when it is created
         * @type {Array.<VpcInfo> || null}
         */
        this.VpcSet = null;

        /**
         * Remarks
         * @type {string || null}
         */
        this.Remark = null;

        /**
         * Whether to enable subdomain recursive DNS. Valid values: `ENABLED` (default) and `DISABLED`.
         * @type {string || null}
         */
        this.DnsForwardStatus = null;

        /**
         * Associates the private domain to a VPC when it is created
         * @type {Array.<VpcInfo> || null}
         */
        this.Vpcs = null;

        /**
         * List of authorized accounts' VPCs to associate with the private domain
         * @type {Array.<AccountVpcInfo> || null}
         */
        this.AccountVpcSet = null;

        /**
         * Whether to enable CNAME flattening. Valid values: `ENABLED` (default) and `DISABLED`.
         * @type {string || null}
         */
        this.CnameSpeedupStatus = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Domain = 'Domain' in params ? params.Domain : null;

        if (params.TagSet) {
            this.TagSet = new Array();
            for (let z in params.TagSet) {
                let obj = new TagInfo();
                obj.deserialize(params.TagSet[z]);
                this.TagSet.push(obj);
            }
        }

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }
        this.Remark = 'Remark' in params ? params.Remark : null;
        this.DnsForwardStatus = 'DnsForwardStatus' in params ? params.DnsForwardStatus : null;

        if (params.Vpcs) {
            this.Vpcs = new Array();
            for (let z in params.Vpcs) {
                let obj = new VpcInfo();
                obj.deserialize(params.Vpcs[z]);
                this.Vpcs.push(obj);
            }
        }

        if (params.AccountVpcSet) {
            this.AccountVpcSet = new Array();
            for (let z in params.AccountVpcSet) {
                let obj = new AccountVpcInfo();
                obj.deserialize(params.AccountVpcSet[z]);
                this.AccountVpcSet.push(obj);
            }
        }
        this.CnameSpeedupStatus = 'CnameSpeedupStatus' in params ? params.CnameSpeedupStatus : null;

    }
}

/**
 * DeleteForwardRule request structure.
 * @class
 */
class DeleteForwardRuleRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Array of forwarding rule IDs.
         * @type {Array.<string> || null}
         */
        this.RuleIdSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleIdSet = 'RuleIdSet' in params ? params.RuleIdSet : null;

    }
}

/**
 * VPC information of a Private DNS account
 * @class
 */
class AccountVpcInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * VpcId: vpc-xadsafsdasd
         * @type {string || null}
         */
        this.UniqVpcId = null;

        /**
         * VPC region: ap-guangzhou, ap-shanghai
Note: this field may return `null`, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Region = null;

        /**
         * VPC account: 123456789
Note: this field may return `null`, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Uin = null;

        /**
         * VPC name: testname
Note: this field may return `null`, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.VpcName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.UniqVpcId = 'UniqVpcId' in params ? params.UniqVpcId : null;
        this.Region = 'Region' in params ? params.Region : null;
        this.Uin = 'Uin' in params ? params.Uin : null;
        this.VpcName = 'VpcName' in params ? params.VpcName : null;

    }
}

/**
 * ModifyPrivateZone response structure.
 * @class
 */
class ModifyPrivateZoneResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeForwardRule response structure.
 * @class
 */
class DescribeForwardRuleResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding rule details.
         * @type {ForwardRule || null}
         */
        this.ForwardRule = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.ForwardRule) {
            let obj = new ForwardRule();
            obj.deserialize(params.ForwardRule)
            this.ForwardRule = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * ModifyPrivateZoneVpc response structure.
 * @class
 */
class ModifyPrivateZoneVpcResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID, such as zone-xxxxxx
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * List of VPCs associated with domain
         * @type {Array.<VpcInfo> || null}
         */
        this.VpcSet = null;

        /**
         * List of authorized accounts' VPCs associated with the private domain
         * @type {Array.<AccountVpcInfoOutput> || null}
         */
        this.AccountVpcSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }

        if (params.AccountVpcSet) {
            this.AccountVpcSet = new Array();
            for (let z in params.AccountVpcSet) {
                let obj = new AccountVpcInfoOutput();
                obj.deserialize(params.AccountVpcSet[z]);
                this.AccountVpcSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Forwarding rule details.
 * @class
 */
class ForwardRule extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain name.
         * @type {string || null}
         */
        this.Domain = null;

        /**
         * Forwarding rule name.
         * @type {string || null}
         */
        this.RuleName = null;

        /**
         * Rule ID
         * @type {string || null}
         */
        this.RuleId = null;

        /**
         * Forwarding rule type. DOWN: From cloud to off-cloud; UP: From off-cloud to cloud.
         * @type {string || null}
         */
        this.RuleType = null;

        /**
         * Creation time
         * @type {string || null}
         */
        this.CreatedAt = null;

        /**
         * Update time
         * @type {string || null}
         */
        this.UpdatedAt = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

        /**
         * Forwarding address.
         * @type {Array.<string> || null}
         */
        this.ForwardAddress = null;

        /**
         * List of VPCs bound to the private domain.
         * @type {Array.<VpcInfo> || null}
         */
        this.VpcSet = null;

        /**
         * ID of the bound private domain.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Tag
         * @type {Array.<TagInfo> || null}
         */
        this.Tags = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Domain = 'Domain' in params ? params.Domain : null;
        this.RuleName = 'RuleName' in params ? params.RuleName : null;
        this.RuleId = 'RuleId' in params ? params.RuleId : null;
        this.RuleType = 'RuleType' in params ? params.RuleType : null;
        this.CreatedAt = 'CreatedAt' in params ? params.CreatedAt : null;
        this.UpdatedAt = 'UpdatedAt' in params ? params.UpdatedAt : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;
        this.ForwardAddress = 'ForwardAddress' in params ? params.ForwardAddress : null;

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagInfo();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

    }
}

/**
 * DescribePrivateZoneList request structure.
 * @class
 */
class DescribePrivateZoneListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Pagination offset, starting from 0.
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Pagination limit. Maximum value: 100. Default value: 20.
         * @type {number || null}
         */
        this.Limit = null;

        /**
         * Filter parameters.
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }

    }
}

/**
 * DescribeRecord request structure.
 * @class
 */
class DescribeRecordRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Record ID
         * @type {string || null}
         */
        this.RecordId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordId = 'RecordId' in params ? params.RecordId : null;

    }
}

/**
 * DescribeRecord response structure.
 * @class
 */
class DescribeRecordResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Record information.
         * @type {RecordInfo || null}
         */
        this.RecordInfo = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.RecordInfo) {
            let obj = new RecordInfo();
            obj.deserialize(params.RecordInfo)
            this.RecordInfo = obj;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * SubscribePrivateZoneService request structure.
 * @class
 */
class SubscribePrivateZoneServiceRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * ModifyPrivateZone request structure.
 * @class
 */
class ModifyPrivateZoneRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Remarks
         * @type {string || null}
         */
        this.Remark = null;

        /**
         * Whether to enable subdomain recursive DNS. Valid values: ENABLED, DISABLED
         * @type {string || null}
         */
        this.DnsForwardStatus = null;

        /**
         * Whether to enable CNAME flattening. Valid values: `ENABLED` and `DISABLED`.
         * @type {string || null}
         */
        this.CnameSpeedupStatus = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.Remark = 'Remark' in params ? params.Remark : null;
        this.DnsForwardStatus = 'DnsForwardStatus' in params ? params.DnsForwardStatus : null;
        this.CnameSpeedupStatus = 'CnameSpeedupStatus' in params ? params.CnameSpeedupStatus : null;

    }
}

/**
 * CreatePrivateZone response structure.
 * @class
 */
class CreatePrivateZoneResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID, such as zone-xxxxxx
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Private domain
         * @type {string || null}
         */
        this.Domain = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.Domain = 'Domain' in params ? params.Domain : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Endpoint information.
 * @class
 */
class EndPointInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint service ID.
         * @type {string || null}
         */
        this.EndPointServiceId = null;

        /**
         * VIP list of the endpoint.
         * @type {Array.<string> || null}
         */
        this.EndPointVipSet = null;

        /**
         * ap-guangzhou
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.RegionCode = null;

        /**
         * Tag key-value pair collection.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<TagInfo> || null}
         */
        this.Tags = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointServiceId = 'EndPointServiceId' in params ? params.EndPointServiceId : null;
        this.EndPointVipSet = 'EndPointVipSet' in params ? params.EndPointVipSet : null;
        this.RegionCode = 'RegionCode' in params ? params.RegionCode : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagInfo();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

    }
}

/**
 * DescribeDashboard response structure.
 * @class
 */
class DescribeDashboardResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of private domain DNS records
         * @type {number || null}
         */
        this.ZoneTotal = null;

        /**
         * Number of VPCs associated with private domain
         * @type {number || null}
         */
        this.ZoneVpcCount = null;

        /**
         * Total number of historical requests
         * @type {number || null}
         */
        this.RequestTotalCount = null;

        /**
         * Traffic package usage
         * @type {Array.<FlowUsage> || null}
         */
        this.FlowUsage = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneTotal = 'ZoneTotal' in params ? params.ZoneTotal : null;
        this.ZoneVpcCount = 'ZoneVpcCount' in params ? params.ZoneVpcCount : null;
        this.RequestTotalCount = 'RequestTotalCount' in params ? params.RequestTotalCount : null;

        if (params.FlowUsage) {
            this.FlowUsage = new Array();
            for (let z in params.FlowUsage) {
                let obj = new FlowUsage();
                obj.deserialize(params.FlowUsage[z]);
                this.FlowUsage.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreatePrivateZoneRecord response structure.
 * @class
 */
class CreatePrivateZoneRecordResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Record ID
         * @type {string || null}
         */
        this.RecordId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RecordId = 'RecordId' in params ? params.RecordId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Private domain information.
 * @class
 */
class RecordInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * Record ID.
         * @type {string || null}
         */
        this.RecordId = null;

        /**
         * Private domain ID, which is in zone-xxxxxxxx format.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Subdomain name.
         * @type {string || null}
         */
        this.SubDomain = null;

        /**
         * Record type. Valid values: A, AAAA, CNAME, MX, TXT, and PTR.
         * @type {string || null}
         */
        this.RecordType = null;

        /**
         * Record value.
         * @type {string || null}
         */
        this.RecordValue = null;

        /**
         * Record cache time. The smaller the value, the faster the record will take effect. Value range: 1-86,400s. Default value: 600.
         * @type {number || null}
         */
        this.TTL = null;

        /**
         * MX priority, which is required when the record type is mx. valid values: 5, 10, 15, 20, 30, 40, and 50.
         * @type {number || null}
         */
        this.MX = null;

        /**
         * Record weight. valid values: 1–100.
         * @type {number || null}
         */
        this.Weight = null;

        /**
         * Record creation time.
         * @type {string || null}
         */
        this.CreatedOn = null;

        /**
         * Record update time.
         * @type {string || null}
         */
        this.UpdatedOn = null;

        /**
         * 0 suspend 1 enable.
         * @type {number || null}
         */
        this.Enabled = null;

        /**
         * Remarks
         * @type {string || null}
         */
        this.Remark = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RecordId = 'RecordId' in params ? params.RecordId : null;
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.SubDomain = 'SubDomain' in params ? params.SubDomain : null;
        this.RecordType = 'RecordType' in params ? params.RecordType : null;
        this.RecordValue = 'RecordValue' in params ? params.RecordValue : null;
        this.TTL = 'TTL' in params ? params.TTL : null;
        this.MX = 'MX' in params ? params.MX : null;
        this.Weight = 'Weight' in params ? params.Weight : null;
        this.CreatedOn = 'CreatedOn' in params ? params.CreatedOn : null;
        this.UpdatedOn = 'UpdatedOn' in params ? params.UpdatedOn : null;
        this.Enabled = 'Enabled' in params ? params.Enabled : null;
        this.Remark = 'Remark' in params ? params.Remark : null;

    }
}

/**
 * DescribePrivateZoneService response structure.
 * @class
 */
class DescribePrivateZoneServiceResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private DNS service activation status. Valid values: ENABLED, DISABLED
         * @type {string || null}
         */
        this.ServiceStatus = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ServiceStatus = 'ServiceStatus' in params ? params.ServiceStatus : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeForwardRuleList response structure.
 * @class
 */
class DescribeForwardRuleListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Number of private domains.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Private domain list.
         * @type {Array.<ForwardRule> || null}
         */
        this.ForwardRuleSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.ForwardRuleSet) {
            this.ForwardRuleSet = new Array();
            for (let z in params.ForwardRuleSet) {
                let obj = new ForwardRule();
                obj.deserialize(params.ForwardRuleSet[z]);
                this.ForwardRuleSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeExtendEndpointList response structure.
 * @class
 */
class DescribeExtendEndpointListResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Total number of endpoints.
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * Endpoint list.
         * @type {Array.<OutboundEndpoint> || null}
         */
        this.OutboundEndpointSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.OutboundEndpointSet) {
            this.OutboundEndpointSet = new Array();
            for (let z in params.OutboundEndpointSet) {
                let obj = new OutboundEndpoint();
                obj.deserialize(params.OutboundEndpointSet[z]);
                this.OutboundEndpointSet.push(obj);
            }
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreatePrivateDNSAccount response structure.
 * @class
 */
class CreatePrivateDNSAccountResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribeAuditLog request structure.
 * @class
 */
class DescribeAuditLogRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Request volume statistics start time
         * @type {string || null}
         */
        this.TimeRangeBegin = null;

        /**
         * Filter parameter. Valid values: ZoneId (private domain ID), Domain (private domain), OperatorUin (operator account ID)
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

        /**
         * Request volume statistics end time
         * @type {string || null}
         */
        this.TimeRangeEnd = null;

        /**
         * Pagination offset, starting from 0
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of entries per page. Maximum value: 100. Default value: 20
         * @type {number || null}
         */
        this.Limit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.TimeRangeBegin = 'TimeRangeBegin' in params ? params.TimeRangeBegin : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }
        this.TimeRangeEnd = 'TimeRangeEnd' in params ? params.TimeRangeEnd : null;
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

    }
}

/**
 * ModifyForwardRule request structure.
 * @class
 */
class ModifyForwardRuleRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding rule ID.
         * @type {string || null}
         */
        this.RuleId = null;

        /**
         * Forwarding rule name.
         * @type {string || null}
         */
        this.RuleName = null;

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleId = 'RuleId' in params ? params.RuleId : null;
        this.RuleName = 'RuleName' in params ? params.RuleName : null;
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;

    }
}

/**
 * DescribeDashboard request structure.
 * @class
 */
class DescribeDashboardRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * ModifyForwardRule response structure.
 * @class
 */
class ModifyForwardRuleResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateEndPoint response structure.
 * @class
 */
class CreateEndPointResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint service ID.
         * @type {string || null}
         */
        this.EndPointServiceId = null;

        /**
         * IP address list of the endpoint.
         * @type {Array.<string> || null}
         */
        this.EndPointVipSet = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointServiceId = 'EndPointServiceId' in params ? params.EndPointServiceId : null;
        this.EndPointVipSet = 'EndPointVipSet' in params ? params.EndPointVipSet : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Operation log
 * @class
 */
class AuditLog extends  AbstractModel {
    constructor(){
        super();

        /**
         * Log type
         * @type {string || null}
         */
        this.Resource = null;

        /**
         * Log table name
         * @type {string || null}
         */
        this.Metric = null;

        /**
         * Total number of logs
         * @type {number || null}
         */
        this.TotalCount = null;

        /**
         * List of logs
         * @type {Array.<AuditLogInfo> || null}
         */
        this.DataSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Resource = 'Resource' in params ? params.Resource : null;
        this.Metric = 'Metric' in params ? params.Metric : null;
        this.TotalCount = 'TotalCount' in params ? params.TotalCount : null;

        if (params.DataSet) {
            this.DataSet = new Array();
            for (let z in params.DataSet) {
                let obj = new AuditLogInfo();
                obj.deserialize(params.DataSet[z]);
                this.DataSet.push(obj);
            }
        }

    }
}

/**
 * DescribePrivateZoneService request structure.
 * @class
 */
class DescribePrivateZoneServiceRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * Output parameters of the associated VPC
 * @class
 */
class AccountVpcInfoOut extends  AbstractModel {
    constructor(){
        super();

        /**
         * VpcId: vpc-xadsafsdasd
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * Region: ap-guangzhou, ap-shanghai
         * @type {string || null}
         */
        this.Region = null;

        /**
         * VPC ID: 123456789
         * @type {string || null}
         */
        this.Uin = null;

        /**
         * VPC name: testname
         * @type {string || null}
         */
        this.VpcName = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.Region = 'Region' in params ? params.Region : null;
        this.Uin = 'Uin' in params ? params.Uin : null;
        this.VpcName = 'VpcName' in params ? params.VpcName : null;

    }
}

/**
 * DeletePrivateZoneRecord request structure.
 * @class
 */
class DeletePrivateZoneRecordRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Record ID
         * @type {string || null}
         */
        this.RecordId = null;

        /**
         * Array of record IDs. `RecordId` takes precedence.
         * @type {Array.<string> || null}
         */
        this.RecordIdSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordId = 'RecordId' in params ? params.RecordId : null;
        this.RecordIdSet = 'RecordIdSet' in params ? params.RecordIdSet : null;

    }
}

/**
 * DescribeForwardRule request structure.
 * @class
 */
class DescribeForwardRuleRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding rule ID.
         * @type {string || null}
         */
        this.RuleId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleId = 'RuleId' in params ? params.RuleId : null;

    }
}

/**
 * DeleteForwardRule response structure.
 * @class
 */
class DeleteForwardRuleResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * CreateEndPoint request structure.
 * @class
 */
class CreateEndPointRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint service ID (namely, VPC endpoint service ID).
         * @type {string || null}
         */
        this.EndPointServiceId = null;

        /**
         * Endpoint region, which should be consistent with the region of the endpoint service.
         * @type {string || null}
         */
        this.EndPointRegion = null;

        /**
         * Number of endpoint IP addresses.
         * @type {number || null}
         */
        this.IpNum = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointServiceId = 'EndPointServiceId' in params ? params.EndPointServiceId : null;
        this.EndPointRegion = 'EndPointRegion' in params ? params.EndPointRegion : null;
        this.IpNum = 'IpNum' in params ? params.IpNum : null;

    }
}

/**
 * ModifyRecordsStatus request structure.
 * @class
 */
class ModifyRecordsStatusRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * The private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * The DNS record IDs.
         * @type {Array.<number> || null}
         */
        this.RecordIds = null;

        /**
         * `enabled`: Enable; `disabled`: Disable.
         * @type {string || null}
         */
        this.Status = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordIds = 'RecordIds' in params ? params.RecordIds : null;
        this.Status = 'Status' in params ? params.Status : null;

    }
}

/**
 * CreatePrivateDNSAccount request structure.
 * @class
 */
class CreatePrivateDNSAccountRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private DNS account
         * @type {PrivateDNSAccount || null}
         */
        this.Account = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

        if (params.Account) {
            let obj = new PrivateDNSAccount();
            obj.deserialize(params.Account)
            this.Account = obj;
        }

    }
}

/**
 * Statistics table
 * @class
 */
class MetricData extends  AbstractModel {
    constructor(){
        super();

        /**
         * Resource description
         * @type {string || null}
         */
        this.Resource = null;

        /**
         * Table name
         * @type {string || null}
         */
        this.Metric = null;

        /**
         * Table data
         * @type {Array.<DatePoint> || null}
         */
        this.DataSet = null;

        /**
         * The total number of requests within the query scope.
Note: This field may return null, indicating that no valid value can be obtained.
         * @type {number || null}
         */
        this.MetricCount = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.Resource = 'Resource' in params ? params.Resource : null;
        this.Metric = 'Metric' in params ? params.Metric : null;

        if (params.DataSet) {
            this.DataSet = new Array();
            for (let z in params.DataSet) {
                let obj = new DatePoint();
                obj.deserialize(params.DataSet[z]);
                this.DataSet.push(obj);
            }
        }
        this.MetricCount = 'MetricCount' in params ? params.MetricCount : null;

    }
}

/**
 * DeletePrivateZoneRecord response structure.
 * @class
 */
class DeletePrivateZoneRecordResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * Private domain information.
 * @class
 */
class PrivateZone extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID, which is in zone-xxxxxxxx format.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * UIN of the domain name owner.
         * @type {number || null}
         */
        this.OwnerUin = null;

        /**
         * Private domain name.
         * @type {string || null}
         */
        this.Domain = null;

        /**
         * Creation time
         * @type {string || null}
         */
        this.CreatedOn = null;

        /**
         * Modification time
         * @type {string || null}
         */
        this.UpdatedOn = null;

        /**
         * Number of records.
         * @type {number || null}
         */
        this.RecordCount = null;

        /**
         * Remarks.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.Remark = null;

        /**
         * List of bound VPCs.
         * @type {Array.<VpcInfo> || null}
         */
        this.VpcSet = null;

        /**
         * Status of the VPC bound with the private domain. SUSPEND: The VPC is not associated; ENABLED: the VPC has been associated.
, FAILED: the VPC fails to be associated.
         * @type {string || null}
         */
        this.Status = null;

        /**
         * Recursive resolution status of the domain name. ENABLED: enabled; DISABLED: disabled.
         * @type {string || null}
         */
        this.DnsForwardStatus = null;

        /**
         * Tag key-value pair collection.
         * @type {Array.<TagInfo> || null}
         */
        this.Tags = null;

        /**
         * List of bound VPCs of the associated account.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<AccountVpcInfoOutput> || null}
         */
        this.AccountVpcSet = null;

        /**
         * Whether the TLD is a custom one.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {boolean || null}
         */
        this.IsCustomTld = null;

        /**
         * CNAME acceleration status. ENABLED: enabled; DISABLED: disabled.
         * @type {string || null}
         */
        this.CnameSpeedupStatus = null;

        /**
         * Forwarding rule name.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ForwardRuleName = null;

        /**
         * Forwarding rule type. DOWN: from cloud to off-cloud; UP: from off-cloud to cloud. Currently, only DOWN is supported.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ForwardRuleType = null;

        /**
         * Forwarding address.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.ForwardAddress = null;

        /**
         * Endpoint name.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Deleted VPC.
Note: This field may return null, indicating that no valid values can be obtained.
         * @type {Array.<VpcInfo> || null}
         */
        this.DeletedVpcSet = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.OwnerUin = 'OwnerUin' in params ? params.OwnerUin : null;
        this.Domain = 'Domain' in params ? params.Domain : null;
        this.CreatedOn = 'CreatedOn' in params ? params.CreatedOn : null;
        this.UpdatedOn = 'UpdatedOn' in params ? params.UpdatedOn : null;
        this.RecordCount = 'RecordCount' in params ? params.RecordCount : null;
        this.Remark = 'Remark' in params ? params.Remark : null;

        if (params.VpcSet) {
            this.VpcSet = new Array();
            for (let z in params.VpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.VpcSet[z]);
                this.VpcSet.push(obj);
            }
        }
        this.Status = 'Status' in params ? params.Status : null;
        this.DnsForwardStatus = 'DnsForwardStatus' in params ? params.DnsForwardStatus : null;

        if (params.Tags) {
            this.Tags = new Array();
            for (let z in params.Tags) {
                let obj = new TagInfo();
                obj.deserialize(params.Tags[z]);
                this.Tags.push(obj);
            }
        }

        if (params.AccountVpcSet) {
            this.AccountVpcSet = new Array();
            for (let z in params.AccountVpcSet) {
                let obj = new AccountVpcInfoOutput();
                obj.deserialize(params.AccountVpcSet[z]);
                this.AccountVpcSet.push(obj);
            }
        }
        this.IsCustomTld = 'IsCustomTld' in params ? params.IsCustomTld : null;
        this.CnameSpeedupStatus = 'CnameSpeedupStatus' in params ? params.CnameSpeedupStatus : null;
        this.ForwardRuleName = 'ForwardRuleName' in params ? params.ForwardRuleName : null;
        this.ForwardRuleType = 'ForwardRuleType' in params ? params.ForwardRuleType : null;
        this.ForwardAddress = 'ForwardAddress' in params ? params.ForwardAddress : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;

        if (params.DeletedVpcSet) {
            this.DeletedVpcSet = new Array();
            for (let z in params.DeletedVpcSet) {
                let obj = new VpcInfo();
                obj.deserialize(params.DeletedVpcSet[z]);
                this.DeletedVpcSet.push(obj);
            }
        }

    }
}

/**
 * CreatePrivateZoneRecord request structure.
 * @class
 */
class CreatePrivateZoneRecordRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Record type. Valid values: "A", "AAAA", "CNAME", "MX", "TXT", "PTR"
         * @type {string || null}
         */
        this.RecordType = null;

        /**
         * Subdomain, such as "www", "m", and "@"
         * @type {string || null}
         */
        this.SubDomain = null;

        /**
         * Record value, such as IP: 192.168.10.2, CNAME: cname.qcloud.com., and MX: mail.qcloud.com.
         * @type {string || null}
         */
        this.RecordValue = null;

        /**
         * Record weight. Value range: 1–100
         * @type {number || null}
         */
        this.Weight = null;

        /**
         * MX priority, which is required when the record type is MX. Valid values: 5, 10, 15, 20, 30, 40, 50
         * @type {number || null}
         */
        this.MX = null;

        /**
         * Record cache time. The smaller the value, the faster the record will take effect. Value range: 1–86400s. Default value: 600
         * @type {number || null}
         */
        this.TTL = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordType = 'RecordType' in params ? params.RecordType : null;
        this.SubDomain = 'SubDomain' in params ? params.SubDomain : null;
        this.RecordValue = 'RecordValue' in params ? params.RecordValue : null;
        this.Weight = 'Weight' in params ? params.Weight : null;
        this.MX = 'MX' in params ? params.MX : null;
        this.TTL = 'TTL' in params ? params.TTL : null;

    }
}

/**
 * DescribeQuotaUsage request structure.
 * @class
 */
class DescribeQuotaUsageRequest extends  AbstractModel {
    constructor(){
        super();

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }

    }
}

/**
 * CreateEndPointAndEndPointService request structure.
 * @class
 */
class CreateEndPointAndEndPointServiceRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * VPC instance ID.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * Whether automatic forwarding is supported.
         * @type {boolean || null}
         */
        this.AutoAcceptFlag = null;

        /**
         * Backend service ID.
         * @type {string || null}
         */
        this.ServiceInstanceId = null;

        /**
         * Endpoint name.
         * @type {string || null}
         */
        this.EndPointName = null;

        /**
         * Endpoint region, which should be consistent with the region of the endpoint service.
         * @type {string || null}
         */
        this.EndPointRegion = null;

        /**
         * Endpoint service name.
         * @type {string || null}
         */
        this.EndPointServiceName = null;

        /**
         * Mounted PaaS service type. Valid values: CLB, CDB, and CRS.
         * @type {string || null}
         */
        this.ServiceType = null;

        /**
         * Number of endpoint IP addresses.
         * @type {number || null}
         */
        this.IpNum = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.AutoAcceptFlag = 'AutoAcceptFlag' in params ? params.AutoAcceptFlag : null;
        this.ServiceInstanceId = 'ServiceInstanceId' in params ? params.ServiceInstanceId : null;
        this.EndPointName = 'EndPointName' in params ? params.EndPointName : null;
        this.EndPointRegion = 'EndPointRegion' in params ? params.EndPointRegion : null;
        this.EndPointServiceName = 'EndPointServiceName' in params ? params.EndPointServiceName : null;
        this.ServiceType = 'ServiceType' in params ? params.ServiceType : null;
        this.IpNum = 'IpNum' in params ? params.IpNum : null;

    }
}

/**
 * ModifyPrivateZoneRecord request structure.
 * @class
 */
class ModifyPrivateZoneRecordRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Record ID
         * @type {string || null}
         */
        this.RecordId = null;

        /**
         * Record type. Valid values: "A", "AAAA", "CNAME", "MX", "TXT", "PTR"
         * @type {string || null}
         */
        this.RecordType = null;

        /**
         * Subdomain, such as "www", "m", and "@"
         * @type {string || null}
         */
        this.SubDomain = null;

        /**
         * Record value, such as IP: 192.168.10.2, CNAME: cname.qcloud.com., and MX: mail.qcloud.com.
         * @type {string || null}
         */
        this.RecordValue = null;

        /**
         * Record weight. Value range: 1–100
         * @type {number || null}
         */
        this.Weight = null;

        /**
         * MX priority, which is required when the record type is MX. Valid values: 5, 10, 15, 20, 30, 40, 50
         * @type {number || null}
         */
        this.MX = null;

        /**
         * Record cache time. The smaller the value, the faster the record will take effect. Value range: 1–86400s. Default value: 600
         * @type {number || null}
         */
        this.TTL = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.RecordId = 'RecordId' in params ? params.RecordId : null;
        this.RecordType = 'RecordType' in params ? params.RecordType : null;
        this.SubDomain = 'SubDomain' in params ? params.SubDomain : null;
        this.RecordValue = 'RecordValue' in params ? params.RecordValue : null;
        this.Weight = 'Weight' in params ? params.Weight : null;
        this.MX = 'MX' in params ? params.MX : null;
        this.TTL = 'TTL' in params ? params.TTL : null;

    }
}

/**
 * VPC information
 * @class
 */
class VpcInfo extends  AbstractModel {
    constructor(){
        super();

        /**
         * VpcId: vpc-xadsafsdasd
         * @type {string || null}
         */
        this.UniqVpcId = null;

        /**
         * VPC region: ap-guangzhou, ap-shanghai
         * @type {string || null}
         */
        this.Region = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.UniqVpcId = 'UniqVpcId' in params ? params.UniqVpcId : null;
        this.Region = 'Region' in params ? params.Region : null;

    }
}

/**
 * PrivateDNS outbound endpoint forwarding IP
 * @class
 */
class EndpointService extends  AbstractModel {
    constructor(){
        super();

        /**
         * Specifies the forwarding target IP network access type.
CLB: Specifies that the forwarding IP is the private CLB VIP.
CCN: Specifies forwarding IP through CCN routing.
         * @type {string || null}
         */
        this.AccessType = null;

        /**
         * Specifies the forwarding target IP address.
         * @type {string || null}
         */
        this.Pip = null;

        /**
         * Specifies the forwarding IP port number.
         * @type {number || null}
         */
        this.Pport = null;

        /**
         * Specifies the unique VPC ID.
         * @type {string || null}
         */
        this.VpcId = null;

        /**
         * Specifies the forwarding target IP proxy IP.
         * @type {string || null}
         */
        this.Vip = null;

        /**
         * Specifies the forwarding target IP proxy port.
         * @type {number || null}
         */
        this.Vport = null;

        /**
         * Specifies the forwarding target IP protocol.
         * @type {string || null}
         */
        this.Proto = null;

        /**
         * Specifies the unique subnet ID.
Required if the access type is CCN.
         * @type {string || null}
         */
        this.SubnetId = null;

        /**
         * ccn id
Required if the access type is CCN.
         * @type {string || null}
         */
        this.AccessGatewayId = null;

        /**
         * The SNAT CIDR block of the outbound endpoint.
         * @type {string || null}
         */
        this.SnatVipCidr = null;

        /**
         * The SNAT IP list of the outbound endpoint.
         * @type {string || null}
         */
        this.SnatVipSet = null;

        /**
         * The region of the outbound endpoint service.
         * @type {string || null}
         */
        this.Region = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.AccessType = 'AccessType' in params ? params.AccessType : null;
        this.Pip = 'Pip' in params ? params.Pip : null;
        this.Pport = 'Pport' in params ? params.Pport : null;
        this.VpcId = 'VpcId' in params ? params.VpcId : null;
        this.Vip = 'Vip' in params ? params.Vip : null;
        this.Vport = 'Vport' in params ? params.Vport : null;
        this.Proto = 'Proto' in params ? params.Proto : null;
        this.SubnetId = 'SubnetId' in params ? params.SubnetId : null;
        this.AccessGatewayId = 'AccessGatewayId' in params ? params.AccessGatewayId : null;
        this.SnatVipCidr = 'SnatVipCidr' in params ? params.SnatVipCidr : null;
        this.SnatVipSet = 'SnatVipSet' in params ? params.SnatVipSet : null;
        this.Region = 'Region' in params ? params.Region : null;

    }
}

/**
 * Traffic package usage
 * @class
 */
class FlowUsage extends  AbstractModel {
    constructor(){
        super();

        /**
         * Traffic package type, Valid values: ZONE (private domain); TRAFFIC (DNS traffic package)
         * @type {string || null}
         */
        this.FlowType = null;

        /**
         * Traffic package quota
         * @type {number || null}
         */
        this.TotalQuantity = null;

        /**
         * Available quota of traffic package
         * @type {number || null}
         */
        this.AvailableQuantity = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.FlowType = 'FlowType' in params ? params.FlowType : null;
        this.TotalQuantity = 'TotalQuantity' in params ? params.TotalQuantity : null;
        this.AvailableQuantity = 'AvailableQuantity' in params ? params.AvailableQuantity : null;

    }
}

/**
 * CreateForwardRule response structure.
 * @class
 */
class CreateForwardRuleResponse extends  AbstractModel {
    constructor(){
        super();

        /**
         * Forwarding rule ID.
         * @type {string || null}
         */
        this.RuleId = null;

        /**
         * Forwarding rule name.
         * @type {string || null}
         */
        this.RuleName = null;

        /**
         * Forwarding rule type.
         * @type {string || null}
         */
        this.RuleType = null;

        /**
         * Private domain ID.
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Endpoint ID.
         * @type {string || null}
         */
        this.EndPointId = null;

        /**
         * The unique request ID, generated by the server, will be returned for every request (if the request fails to reach the server for other reasons, the request will not obtain a RequestId). RequestId is required for locating a problem.
         * @type {string || null}
         */
        this.RequestId = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.RuleId = 'RuleId' in params ? params.RuleId : null;
        this.RuleName = 'RuleName' in params ? params.RuleName : null;
        this.RuleType = 'RuleType' in params ? params.RuleType : null;
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;
        this.EndPointId = 'EndPointId' in params ? params.EndPointId : null;
        this.RequestId = 'RequestId' in params ? params.RequestId : null;

    }
}

/**
 * DescribePrivateZoneRecordList request structure.
 * @class
 */
class DescribePrivateZoneRecordListRequest extends  AbstractModel {
    constructor(){
        super();

        /**
         * Private domain ID: zone-xxxxxx
         * @type {string || null}
         */
        this.ZoneId = null;

        /**
         * Filter parameter
         * @type {Array.<Filter> || null}
         */
        this.Filters = null;

        /**
         * Pagination offset, starting from 0
         * @type {number || null}
         */
        this.Offset = null;

        /**
         * Number of entries per page. Maximum value: 100. Default value: 20
         * @type {number || null}
         */
        this.Limit = null;

    }

    /**
     * @private
     */
    deserialize(params) {
        if (!params) {
            return;
        }
        this.ZoneId = 'ZoneId' in params ? params.ZoneId : null;

        if (params.Filters) {
            this.Filters = new Array();
            for (let z in params.Filters) {
                let obj = new Filter();
                obj.deserialize(params.Filters[z]);
                this.Filters.push(obj);
            }
        }
        this.Offset = 'Offset' in params ? params.Offset : null;
        this.Limit = 'Limit' in params ? params.Limit : null;

    }
}

module.exports = {
    DescribeExtendEndpointListRequest: DescribeExtendEndpointListRequest,
    DescribeQuotaUsageResponse: DescribeQuotaUsageResponse,
    ModifyPrivateZoneVpcRequest: ModifyPrivateZoneVpcRequest,
    CreateEndPointAndEndPointServiceResponse: CreateEndPointAndEndPointServiceResponse,
    ForwardIp: ForwardIp,
    DescribePrivateDNSAccountListResponse: DescribePrivateDNSAccountListResponse,
    CreateForwardRuleRequest: CreateForwardRuleRequest,
    PrivateDNSAccount: PrivateDNSAccount,
    DescribeForwardRuleListRequest: DescribeForwardRuleListRequest,
    DescribeEndPointListRequest: DescribeEndPointListRequest,
    DescribePrivateZoneRecordListResponse: DescribePrivateZoneRecordListResponse,
    DescribePrivateZoneListResponse: DescribePrivateZoneListResponse,
    AccountVpcInfoOutput: AccountVpcInfoOutput,
    DescribeEndPointRegionRequest: DescribeEndPointRegionRequest,
    DescribeAuditLogResponse: DescribeAuditLogResponse,
    ModifyRecordsStatusResponse: ModifyRecordsStatusResponse,
    CreateExtendEndpointRequest: CreateExtendEndpointRequest,
    DatePoint: DatePoint,
    DescribeAccountVpcListResponse: DescribeAccountVpcListResponse,
    DescribeEndPointRegionResponse: DescribeEndPointRegionResponse,
    DeleteEndPointResponse: DeleteEndPointResponse,
    Filter: Filter,
    PrivateZoneRecord: PrivateZoneRecord,
    DescribePrivateDNSAccountListRequest: DescribePrivateDNSAccountListRequest,
    DeleteEndPointRequest: DeleteEndPointRequest,
    AuditLogInfo: AuditLogInfo,
    OutboundEndpoint: OutboundEndpoint,
    DescribeRequestDataRequest: DescribeRequestDataRequest,
    ModifyPrivateZoneRecordResponse: ModifyPrivateZoneRecordResponse,
    DescribeAccountVpcListRequest: DescribeAccountVpcListRequest,
    CreateExtendEndpointResponse: CreateExtendEndpointResponse,
    DescribeRequestDataResponse: DescribeRequestDataResponse,
    DescribeEndPointListResponse: DescribeEndPointListResponse,
    RegionInfo: RegionInfo,
    TagInfo: TagInfo,
    TldQuota: TldQuota,
    SubscribePrivateZoneServiceResponse: SubscribePrivateZoneServiceResponse,
    CreatePrivateZoneRequest: CreatePrivateZoneRequest,
    DeleteForwardRuleRequest: DeleteForwardRuleRequest,
    AccountVpcInfo: AccountVpcInfo,
    ModifyPrivateZoneResponse: ModifyPrivateZoneResponse,
    DescribeForwardRuleResponse: DescribeForwardRuleResponse,
    ModifyPrivateZoneVpcResponse: ModifyPrivateZoneVpcResponse,
    ForwardRule: ForwardRule,
    DescribePrivateZoneListRequest: DescribePrivateZoneListRequest,
    DescribeRecordRequest: DescribeRecordRequest,
    DescribeRecordResponse: DescribeRecordResponse,
    SubscribePrivateZoneServiceRequest: SubscribePrivateZoneServiceRequest,
    ModifyPrivateZoneRequest: ModifyPrivateZoneRequest,
    CreatePrivateZoneResponse: CreatePrivateZoneResponse,
    EndPointInfo: EndPointInfo,
    DescribeDashboardResponse: DescribeDashboardResponse,
    CreatePrivateZoneRecordResponse: CreatePrivateZoneRecordResponse,
    RecordInfo: RecordInfo,
    DescribePrivateZoneServiceResponse: DescribePrivateZoneServiceResponse,
    DescribeForwardRuleListResponse: DescribeForwardRuleListResponse,
    DescribeExtendEndpointListResponse: DescribeExtendEndpointListResponse,
    CreatePrivateDNSAccountResponse: CreatePrivateDNSAccountResponse,
    DescribeAuditLogRequest: DescribeAuditLogRequest,
    ModifyForwardRuleRequest: ModifyForwardRuleRequest,
    DescribeDashboardRequest: DescribeDashboardRequest,
    ModifyForwardRuleResponse: ModifyForwardRuleResponse,
    CreateEndPointResponse: CreateEndPointResponse,
    AuditLog: AuditLog,
    DescribePrivateZoneServiceRequest: DescribePrivateZoneServiceRequest,
    AccountVpcInfoOut: AccountVpcInfoOut,
    DeletePrivateZoneRecordRequest: DeletePrivateZoneRecordRequest,
    DescribeForwardRuleRequest: DescribeForwardRuleRequest,
    DeleteForwardRuleResponse: DeleteForwardRuleResponse,
    CreateEndPointRequest: CreateEndPointRequest,
    ModifyRecordsStatusRequest: ModifyRecordsStatusRequest,
    CreatePrivateDNSAccountRequest: CreatePrivateDNSAccountRequest,
    MetricData: MetricData,
    DeletePrivateZoneRecordResponse: DeletePrivateZoneRecordResponse,
    PrivateZone: PrivateZone,
    CreatePrivateZoneRecordRequest: CreatePrivateZoneRecordRequest,
    DescribeQuotaUsageRequest: DescribeQuotaUsageRequest,
    CreateEndPointAndEndPointServiceRequest: CreateEndPointAndEndPointServiceRequest,
    ModifyPrivateZoneRecordRequest: ModifyPrivateZoneRecordRequest,
    VpcInfo: VpcInfo,
    EndpointService: EndpointService,
    FlowUsage: FlowUsage,
    CreateForwardRuleResponse: CreateForwardRuleResponse,
    DescribePrivateZoneRecordListRequest: DescribePrivateZoneRecordListRequest,

}
